package leetcode;
/**
 * NC64 二叉搜索树与双向链表
 * 输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的双向链表。
 * 数据范围：输入二叉树的节点数 0≤n≤1000，二叉树中每个节点的值 0≤val≤1000
 * 要求：空间复杂度O(1)（即在原树上操作），时间复杂度 O(n)
 * 注意:
 *     1.要求不能创建任何新的结点，只能调整树中结点指针的指向。当转化完成以后，树中节点的左指针需要指向前驱，树中节点的右指针需要指向后继
 *     2.返回链表中的第一个节点的指针
 *     3.函数返回的TreeNode，有左右指针，其实可以看成一个双向链表的数据结构
 *     4.你不用输出双向链表，程序会根据你的返回值自动打印输出
 */
public class NowCoder_NC64 {
    public TreeNode Convert(TreeNode pRootOfTree) {
        //边界条件
        if(pRootOfTree == null){
            return null;
        }
        //左子树构建链表
        TreeNode leftListHead = Convert(pRootOfTree.left);
        //右子树构建链表
        TreeNode rightListHead = Convert(pRootOfTree.right);
        //连接左链表和根节点
        if(leftListHead != null){
            //找到左链表的尾节点
            TreeNode leftListTail = leftListHead;
            while(leftListTail.right != null){
                leftListTail = leftListTail.right;
            }
            leftListTail.right = pRootOfTree;
            pRootOfTree.left = leftListTail;
        }
        //连接根节点和右链表
        if(rightListHead != null){
            pRootOfTree.right = rightListHead;
            rightListHead.left = pRootOfTree;
        }
        //返回链表的头节点
        return leftListHead == null ? pRootOfTree : leftListHead;
    }
}
